package com.springframework.boot.controller;


import com.springframework.boot.clients.CommoditiesClient;
import lombok.extern.slf4j.Slf4j;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.cloud.client.ServiceInstance;
import org.springframework.cloud.client.discovery.DiscoveryClient;
import org.springframework.cloud.client.loadbalancer.LoadBalanced;
import org.springframework.cloud.client.loadbalancer.LoadBalancerClient;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.RestController;
import org.springframework.web.client.RestTemplate;

import java.util.List;
import java.util.Map;

@Slf4j
@RestController
public class UsresController {

    @Autowired
    private RestTemplate restTemplate;//带有ribbon负载均衡的restTemplate


    @Autowired
    private DiscoveryClient discoveryClient;

    @Autowired
    private LoadBalancerClient loadBalancerClient;

    @Autowired
    private CommoditiesClient commoditiesClient;

    @GetMapping("users/showCommoditiesMsg")
    public String showCommoditiesMsg() {
        /**
         * 第一种服务端调用方式  服务地址 http://localhost:8899/commodities/showMsg  get请求  返回String类型
         * 参数1  ：请求路径
         * 参数2 ： 返回值类型
         *
         * 缺点：1、没有经过注册中心，代码写死，不利于维护，当服务宕机后不能高效剔除
         *      2、无法实现负载均衡
         *
         *      注意：当restTemplate的bean配置方法上有@LoadBalanced注解时，就不能使用以下访问了，因为@LoadBalanced是ribbon的负载均衡注解，
         *        会默认将http://后面和第一个 / 中间的值当作 服务中心的服务名称
         *
         */
//        String msg = restTemplate.getForObject("http://localhost:8899/commodities/showMsg", String.class);
//        log.info("调用成功返回的信息:[{}]", msg);

        /**
         * ribbon调用方式
         * discovery client    loadBalancerClient     @LoadBlance
         */

        /**
         * 第二种：discovery client 获取到所有可用的对应服务   需要自己手动遍历，实现负载均衡
         *
         */
//        List<ServiceInstance> discoverys = discoveryClient.getInstances("commodities");
//        discoverys.forEach(commoditie -> {
//            System.out.println(commoditie.getHost());
//            System.out.println(commoditie.getPort());
//        });

        /**
         * 第三种  loadBalancer   client   需要每次选择并且拼接
         *
         */
//        ServiceInstance loadBalancers = loadBalancerClient.choose("commodities");
//        System.out.println(loadBalancers.getUri());
//        String msg = restTemplate.getForObject(loadBalancers.getUri()+"/commodities/showMsg", String.class);

        /**
         * 第四种  @LoadBlance + RestTemplate
         *
         */
//        String msg = restTemplate.getForObject("http://commodities/commodities/showMsg", String.class);
        /**
         * 第五种
         *  利用openfeign组件调用服务
         */

        return commoditiesClient.showMsg();
    }

    @GetMapping("users/findCommoditiesById")
    public Map<String,Object> findCommoditiesById(String commodityId){
        Map<String, Object> commodity = commoditiesClient.findById(commodityId);
        log.info("商品信息返回数据为：【{}】",commodity);
        return commodity;
    }
}
